package iedcyt.acute.businessServices.collGroups.dataMethods;



import iedcyt.acute.businessServices.common.DocumentsUtils;
import iedcyt.acute.businessServices.common.SignsUtils;
import iedcyt.acute.dataAccess.domain.acute1.Author_Data;
import iedcyt.acute.dataAccess.domain.acute1.CollGroupData;
import iedcyt.acute.dataAccess.domain.acute1.Document;
import iedcyt.acute.dataAccess.domain.acute1.Type;
import iedcyt.acute.dataAccess.domain.maesorg.WoS_REVISTAS_FIs;
import iedcyt.acute.dataAccess.factories.AbsACUTE1FactoryDao;
import iedcyt.acute.dataAccess.factories.AbsMaesorgFactoryDao;

import java.util.ArrayList;
import java.util.List;

/**
 * Clase que se encarga del calculo de level medio de los documentos
 * @author ISR
 *
 */
public class CollGroupData_AVGLevelMethod extends ACollGroupDataMethod {

		
	/**
	 * se encarga del calculo de level medio de los documentos
	 * @param type permite indicar los tipos de documentos para el calculo
	 */
	public CollGroupData_AVGLevelMethod(List<String> type)
	{
		_types = type;
		this._dataDescription = "Level medio";
	}
	
	/**
	 * Se excluyen de la media los documentos con Level a null
	 * @param grDocs
	 * @return
	 */
	private double propExecution(List<Document> grDocs) {

		int totalDocs = 0;
		int sumLevel = 0;
		
		for (Document doc: grDocs)
		{
			
			//Compruebo si es necesario mirar el tipo, y si lo es se comprueba
			if ((_types.containsAll(Type.getAllTypes()))||((!_types.containsAll(Type.getAllTypes()))&&(_types.contains(doc.get_TYPE()))))
			{
				List<WoS_REVISTAS_FIs> fis = AbsMaesorgFactoryDao.getInstance().get_WoS_REVISTAS_FIsDao().selectByIdPub(doc.get_idPub());
				
				if (fis.size() > 0)
				{
					if (fis.get(0).get_Level() != null)
					{
						//Los documentos con Level a null no cuentan para la media
						totalDocs++;
						sumLevel += fis.get(0).get_Level().intValue();
					}
				}
			}
		}
		
		return (double)sumLevel/(double)totalDocs;
		
		
	}
	
	/**
	 * @see iedcyt.acute.businessServices.collGroups.dataMethods.ACollGroupDataMethod#execute(int)
	 */
	@Override
	public List<CollGroupData> execute(int idGr) {
		List<Document> grDocs = DocumentsUtils.getDocumentsByIdGroup(idGr);
		
		double value = propExecution(grDocs);
		
		CollGroupData data = new CollGroupData(idGr, this._dataDescription, value+"");
		
		ArrayList<CollGroupData> arr = new ArrayList<CollGroupData>();
		arr.add(data);
		
		return arr;
	}
	
	/**
	 * @see iedcyt.acute.businessServices.collGroups.dataMethods.ACollGroupDataMethod#executeForAuthor(int)
	 */
	@Override
	public List<Author_Data> executeForAuthor(int idAu) {
		
		List<Document> auDocs = AbsACUTE1FactoryDao.getInstance().getDocumentDao().selectByIdSigns(SignsUtils.getAuthorIdSigns(idAu));
		
		double value = propExecution(auDocs);
		
		Author_Data data = new Author_Data(idAu, this._dataDescription, value+"");
		
		ArrayList<Author_Data> arr = new ArrayList<Author_Data>();
		arr.add(data);
		
		return arr;
	}
	
	

	
}